package com.example.chapter04;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.chapter04.util.DateUtil;

/**
 * 活动请求示例 - 演示使用新的Activity Result API进行页面间通信
 *
 * 功能说明：
 * 1. 本Activity作为请求方，向ActResponseActivity发送请求消息
 * 2. 使用ActivityResultLauncher接收ActResponseActivity返回的响应消息
 * 3. 展示请求消息内容和响应消息内容
 */
public class ActRequestActivity extends AppCompatActivity implements View.OnClickListener {

    // 待发送的请求消息内容
    private static final String mRequest = "你睡了吗？来我家睡吧";

    // ActivityResultLauncher对象，用于启动目标Activity并接收返回结果
    // 这是AndroidX推荐的新方式，替代了旧的startActivityForResult方法
    private ActivityResultLauncher<Intent> register;

    // 用于显示响应结果的文本视图
    private TextView tv_response;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 启用EdgeToEdge模式，让内容延伸到状态栏和导航栏下方
        EdgeToEdge.enable(this);

        // 设置布局文件
        setContentView(R.layout.activity_act_request);

        // 初始化请求消息显示控件，并设置要发送的消息内容
        TextView tv_request = findViewById(R.id.tv_request);
        tv_request.setText("待发送的消息为：" + mRequest);

        // 初始化响应结果显示控件
        tv_response = findViewById(R.id.tv_response);

        // 为请求按钮设置点击监听器（当前Activity实现了OnClickListener接口）
        findViewById(R.id.btn_request).setOnClickListener(this);

        // 注册ActivityResultLauncher，用于处理目标Activity返回的结果
        // 这里使用ActivityResultContracts.StartActivityForResult()作为合约
        register = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    // 当目标Activity返回结果时，会回调这个lambda表达式

                    // 首先判断返回结果是否不为空
                    if (result != null) {
                        // 获取返回的Intent对象
                        Intent intent = result.getData();

                        // 判断Intent不为空，并且返回码是RESULT_OK（表示操作成功）
                        if (intent != null && result.getResultCode() == Activity.RESULT_OK) {
                            // 从返回的Intent中获取携带的数据包Bundle
                            Bundle bundle = intent.getExtras();

                            // 从Bundle中取出响应时间和响应内容
                            String response_time = bundle.getString("response_time");
                            String response_content = bundle.getString("response_content");

                            // 格式化响应结果字符串
                            String desc = String.format("收到返回消息：\n应答时间为%s\n应答内容为%s",
                                    response_time, response_content);

                            // 把返回消息的详情显示在文本视图上
                            tv_response.setText(desc);
                        }
                    }
                }
        );

        // 设置窗口内边距，适配状态栏和导航栏
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }

    @Override
    public void onClick(View v) {
        // 处理按钮点击事件

        // 创建跳转到ActResponseActivity的Intent
        Intent intent = new Intent(this, ActResponseActivity.class);

        // 创建一个新的Bundle对象，用于携带数据
        Bundle bundle = new Bundle();

        // 往Bundle中放入请求时间（使用DateUtil工具类获取当前时间）
        bundle.putString("request_time", DateUtil.getNowTime());

        // 往Bundle中放入请求内容
        bundle.putString("request_content", mRequest);

        // 将Bundle数据放入Intent中
        intent.putExtras(bundle);

        // 使用ActivityResultLauncher启动目标Activity
        // 这会触发之前注册的回调函数来处理返回结果
        register.launch(intent);
    }
}